#ifndef ABSTRACTGRAPH_H
#define ABSTRACTGRAPH_H

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cstring>
#include <sstream>
#include <list>
#include <vector>
#include "GraphInterface.h"

class AbstractGraph : public GraphInterface
{
 public:
  AbstractGraph();
  virtual ~AbstractGraph();
  AbstractGraph(const AbstractGraph& other);
  
  virtual int getSize() const;
  virtual bool hasNoEdge(); 
  virtual int_vect_vect getAdjencyList()const;
  virtual std::vector<int> neighbours(int vertex) const;
  virtual int degre(int vertex)const;
  
  virtual int addVertex();
  virtual int addVertex(int vertex);
  
  virtual void addEdge(int vertex1, int vertex2);
  virtual void delEdge(int vertex1, int vertex2);
  virtual void delEdgeFromVertex(int vertex);
  virtual bool isEdge(int vertex1, int vertex2);
  //std::ostream& operator<<(std::ostream &os,const AbstractGraph);
  
  virtual std::string toString();
  virtual void printGraph();
  
  virtual void readFile(std::string path);
  virtual void writeFile(std::string path);
  std::vector<int> operator[](int i) const;
 protected:
  int_vect_vect adgencyList;
};

std::ostream& operator<<(std::ostream &os,const AbstractGraph);

#endif // ABSTRACTGRAPH_H
